]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
st: Keep weak ref on texture cache bound texture source
authorCarlos Garnacho <carlosg@gnome.org>
Fri, 12 Feb 2021 22:10:25 +0000 (23:10 +0100)
committerMarge Bot <marge-bot@gnome.org>
Mon, 15 Feb 2021 21:09:53 +0000 (21:09 +0000)
We don't keep any ref on it, so it might leave us with a dangling
pointer here.

Fixes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/3491
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1672>

src/st/st-texture-cache.c

index 89620706cb75d41574e8cf338576940938c344e4..07b1166a1b7984e6192e1729fc69b85c0315bd7c 100644 (file)
@@ -798,6 +798,10 @@ st_texture_cache_bind_weak_notify (gpointer     data,
 {
   StTextureCachePropertyBind *bind = data;
   bind->weakref_active = FALSE;
+  if (G_OBJECT (bind->image) != source_location)
+    g_object_weak_unref (G_OBJECT (bind->image), st_texture_cache_bind_weak_notify, bind);
+  if (bind->source != source_location)
+    g_object_weak_unref (G_OBJECT (bind->source), st_texture_cache_bind_weak_notify, bind);
   g_signal_handler_disconnect (bind->source, bind->notify_signal_id);
 }
 
@@ -805,8 +809,13 @@ static void
 st_texture_cache_free_bind (gpointer data)
 {
   StTextureCachePropertyBind *bind = data;
+
   if (bind->weakref_active)
-    g_object_weak_unref (G_OBJECT (bind->image), st_texture_cache_bind_weak_notify, bind);
+    {
+      g_object_weak_unref (G_OBJECT (bind->image), st_texture_cache_bind_weak_notify, bind);
+      g_object_weak_unref (G_OBJECT (bind->source), st_texture_cache_bind_weak_notify, bind);
+    }
+
   g_free (bind);
 }
 
@@ -840,6 +849,7 @@ st_texture_cache_bind_cairo_surface_property (StTextureCache    *cache,
   st_texture_cache_reset_texture (bind, property_name);
 
   g_object_weak_ref (G_OBJECT (bind->image), st_texture_cache_bind_weak_notify, bind);
+  g_object_weak_ref (G_OBJECT (bind->source), st_texture_cache_bind_weak_notify, bind);
   bind->weakref_active = TRUE;
 
   notify_key = g_strdup_printf ("notify::%s", property_name);